home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / share / perl5 / Debconf / Config.pm < prev    next >
Text File  |  2008-10-10  |  7KB  |  286 lines

  1. #!/usr/bin/perl -w
  2. # This file was preprocessed, do not edit!
  3.  
  4.  
  5. package Debconf::Config;
  6. use strict;
  7. use Debconf::Question;
  8. use Debconf::Gettext;
  9. use Debconf::Priority qw(priority_valid priority_list);
  10. use Debconf::Log qw(warn);
  11. use Debconf::Db;
  12.  
  13. use fields qw(config templates frontend frontend_forced priority terse reshow
  14.               admin_email log debug nowarnings smileys sigils
  15.               noninteractive_seen);
  16. our $config=fields::new('Debconf::Config');
  17.  
  18. our @config_files=("/etc/debconf.conf", "/usr/share/debconf/debconf.conf");
  19. if ($ENV{DEBCONF_SYSTEMRC}) {
  20.     unshift @config_files, $ENV{DEBCONF_SYSTEMRC};
  21. } else {
  22.     unshift @config_files, ((getpwuid($>))[7])."/.debconfrc";
  23. }
  24.        
  25.  
  26. sub _hashify ($$) {
  27.     my $text=shift;
  28.     my $hash=shift;
  29.  
  30.     $text =~ s/\${([^}]+)}/$ENV{$1}/eg;
  31.     
  32.     my %ret;
  33.     my $i;
  34.     foreach my $line (split /\n/, $text) {
  35.         next if $line=~/^\s*#/; # comment
  36.         next if $line=~/^\s*$/; # blank
  37.         $line=~s/^\s+//;
  38.         $line=~s/\s+$//;
  39.         $i++;
  40.         my ($key, $value)=split(/\s*:\s*/, $line, 2);
  41.         $key=~tr/-/_/;
  42.         die "Parse error" unless defined $key and length $key;
  43.         $hash->{lc($key)}=$value;
  44.     }
  45.     return $i;
  46. }
  47.  
  48. sub _env_to_driver {
  49.     my $value=shift;
  50.     
  51.     my ($name, $options) = $value =~ m/^(\w+)(?:{(.*)})?$/;
  52.     return unless $name;
  53.     
  54.     return $name if Debconf::DbDriver->driver($name);
  55.     
  56.     my %hash = @_; # defaults from params
  57.     $hash{driver} = $name;
  58.     
  59.     if (defined $options) {
  60.         foreach (split ' ', $options) {
  61.             if (/^(\w+):(.*)/) {
  62.                 $hash{$1}=$2;
  63.             }
  64.             else {
  65.                 $hash{filename}=$_;
  66.             }
  67.         }
  68.     }
  69.     return Debconf::Db->makedriver(%hash)->{name};
  70. }
  71.  
  72. sub load {
  73.     my $class=shift;
  74.     my $cf=shift;
  75.     my @defaults=@_;
  76.     
  77.     if (! $cf) {
  78.         for my $file (@config_files) {
  79.             $cf=$file, last if -e $file;
  80.         }
  81.     }
  82.     die "No config file found" unless $cf;
  83.  
  84.     open (DEBCONF_CONFIG, $cf) or die "$cf: $!\n";
  85.     local $/="\n\n"; # read a stanza at a time
  86.  
  87.     1 until _hashify(<DEBCONF_CONFIG>, $config) || eof DEBCONF_CONFIG;
  88.  
  89.     if (! exists $config->{config}) {
  90.         print STDERR "debconf: ".gettext("Config database not specified in config file.")."\n";
  91.         exit(1);
  92.     }
  93.     if (! exists $config->{templates}) {
  94.         print STDERR "debconf: ".gettext("Template database not specified in config file.")."\n";
  95.         exit(1);
  96.     }
  97.  
  98.     if (exists $config->{sigils} || exists $config->{smileys}) {
  99.         print STDERR "debconf: ".gettext("The Sigils and Smileys options in the config file are no longer used. Please remove them.")."\n";
  100.     }
  101.  
  102.     while (<DEBCONF_CONFIG>) {
  103.         my %config=(@defaults);
  104.         if (exists $ENV{DEBCONF_DB_REPLACE}) {
  105.             $config{readonly} = "true";
  106.         }
  107.         next unless _hashify($_, \%config);
  108.         eval {
  109.             Debconf::Db->makedriver(%config);
  110.         };
  111.         if ($@) {
  112.             print STDERR "debconf: ".sprintf(gettext("Problem setting up the database defined by stanza %s of %s."),$., $cf)."\n";
  113.             die $@;
  114.         }
  115.     }
  116.     close DEBCONF_CONFIG;
  117.  
  118.     if (exists $ENV{DEBCONF_DB_REPLACE}) {
  119.         $config->{config} = _env_to_driver($ENV{DEBCONF_DB_REPLACE},
  120.             name => "_ENV_REPLACE");
  121.         Debconf::Db->makedriver(
  122.             driver => "Pipe",
  123.             name => "_ENV_REPLACE_templates",
  124.             infd => "none",
  125.             outfd => "none",
  126.         );
  127.         my @template_stack = ("_ENV_REPLACE_templates", $config->{templates});
  128.         Debconf::Db->makedriver(
  129.             driver => "Stack",
  130.             name => "_ENV_stack_templates",
  131.             stack => join(", ", @template_stack),
  132.         );
  133.         $config->{templates} = "_ENV_stack_templates";
  134.     }
  135.  
  136.     my @finalstack = ($config->{config});
  137.     if (exists $ENV{DEBCONF_DB_OVERRIDE}) {
  138.         unshift @finalstack, _env_to_driver($ENV{DEBCONF_DB_OVERRIDE},
  139.             name => "_ENV_OVERRIDE");
  140.     }
  141.     if (exists $ENV{DEBCONF_DB_FALLBACK}) {
  142.         push @finalstack, _env_to_driver($ENV{DEBCONF_DB_FALLBACK},
  143.             name => "_ENV_FALLBACK",
  144.             readonly => "true");
  145.     }
  146.     if (@finalstack > 1) {
  147.         Debconf::Db->makedriver(
  148.             driver => "Stack",
  149.             name => "_ENV_stack",
  150.             stack  => join(", ", @finalstack),
  151.         );
  152.         $config->{config} = "_ENV_stack";
  153.     }
  154. }
  155.  
  156.  
  157. sub getopt {
  158.     my $class=shift;
  159.     my $usage=shift;
  160.  
  161.     my $showusage=sub { # closure
  162.         print STDERR $usage."\n";
  163.         print STDERR gettext(<<EOF);
  164.   -f,  --frontend        Specify debconf frontend to use.
  165.   -p,  --priority        Specify minimum priority question to show.
  166.        --terse            Enable terse mode.
  167. EOF
  168.         exit 1;
  169.     };
  170.  
  171.     return unless grep { $_ =~ /^-/ } @ARGV;
  172.     
  173.     require Getopt::Long;
  174.     Getopt::Long::Configure('bundling');
  175.     Getopt::Long::GetOptions(
  176.         'frontend|f=s',    sub { shift; $class->frontend(shift); $config->frontend_forced(1) },
  177.         'priority|p=s',    sub { shift; $class->priority(shift) },
  178.         'terse',    sub { $config->{terse} = 'true' },
  179.         'help|h',    $showusage,
  180.         @_,
  181.     ) || $showusage->();
  182. }
  183.  
  184.  
  185. sub frontend {
  186.     my $class=shift;
  187.     
  188.     return $ENV{DEBIAN_FRONTEND} if exists $ENV{DEBIAN_FRONTEND};
  189.     $config->{frontend}=shift if @_;
  190.     return $config->{frontend} if exists $config->{frontend};
  191.     
  192.     my $ret='dialog';
  193.     my $question=Debconf::Question->get('debconf/frontend');
  194.     if ($question) {
  195.         $ret=lcfirst($question->value) || $ret;
  196.     }
  197.     return $ret;
  198. }
  199.  
  200.  
  201. sub frontend_forced {
  202.     my ($class, $val) = @_;
  203.     $config->{frontend_forced} = $val
  204.         if defined $val || exists $ENV{DEBIAN_FRONTEND};
  205.     return $config->{frontend_forced} ? 1 : 0;
  206. }
  207.  
  208.  
  209. sub priority {
  210.     my $class=shift;
  211.     return $ENV{DEBIAN_PRIORITY} if exists $ENV{DEBIAN_PRIORITY};
  212.     if (@_) {
  213.         my $newpri=shift;
  214.         if (! priority_valid($newpri)) {
  215.             warn(sprintf(gettext("Ignoring invalid priority \"%s\""), $newpri));
  216.             warn(sprintf(gettext("Valid priorities are: %s"), join(" ", priority_list)));
  217.         }
  218.         else {
  219.             $config->{priority}=$newpri;
  220.         }
  221.     }
  222.     return $config->{priority} if exists $config->{priority};
  223.  
  224.     my $ret='high';
  225.     my $question=Debconf::Question->get('debconf/priority');
  226.     if ($question) {
  227.         $ret=$question->value || $ret;
  228.     }
  229.     return $ret;
  230. }
  231.  
  232.  
  233. sub terse {
  234.     my $class=shift;
  235.     return $ENV{DEBCONF_TERSE} if exists $ENV{DEBCONF_TERSE};
  236.     $config->{terse}=$_[0] if @_;
  237.     return $config->{terse} if exists $config->{terse};
  238.     return 'false';
  239. }
  240.  
  241.  
  242. sub nowarnings {
  243.     my $class=shift;
  244.     return $ENV{DEBCONF_NOWARNINGS} if exists $ENV{DEBCONF_NOWARNINGS};
  245.     $config->{nowarnings}=$_[0] if @_;
  246.     return $config->{nowarnings} if exists $config->{nowarnings};
  247.     return 'false';
  248. }
  249.  
  250.  
  251. sub debug {
  252.     my $class=shift;
  253.     return $ENV{DEBCONF_DEBUG} if exists $ENV{DEBCONF_DEBUG};
  254.     return $config->{debug} if exists $config->{debug};
  255.     return '';
  256. }
  257.  
  258.  
  259. sub admin_email {
  260.     my $class=shift;
  261.     return $ENV{DEBCONF_ADMIN_EMAIL} if exists $ENV{DEBCONF_ADMIN_EMAIL};
  262.     return $config->{admin_email} if exists $config->{admin_email};
  263.     return 'root';
  264. }
  265.  
  266.  
  267. sub noninteractive_seen {
  268.     my $class=shift;
  269.     return $ENV{DEBCONF_NONINTERACTIVE_SEEN} if exists $ENV{DEBCONF_NONINTERACTIVE_SEEN};
  270.     return $config->{noninteractive_seen} if exists $config->{noninteractive_seen};
  271.     return 'false';
  272. }
  273.  
  274.  
  275. sub AUTOLOAD {
  276.     (my $field = our $AUTOLOAD) =~ s/.*://;
  277.     my $class=shift;
  278.     
  279.     return $config->{$field}=shift if @_;
  280.     return $config->{$field} if defined $config->{$field};
  281.     return '';
  282. }
  283.  
  284.  
  285. 1
  286.